#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Инициализация сервиса
# Папка prefs.DATA_PATH должна иметь владельца пользователя и группу апача
# После создания базы reports.db этому файлу надо установить владельца - пользователя и группу апача

import sqlite3
import os
import pwd
import grp
import os.path
import sys

local_path = os.path.split(__file__)[0]
if local_path not in sys.path:
    sys.path.insert(0, local_path)

import mzrepos_prefs prefs

conn = sqlite3.connect(os.path.join(prefs.DATA_PATH, prefs.DB_NAME))
conn.execute("PRAGMA foreign_keys=OFF;")
cur = conn.cursor()

# 1.2.643.5.1.13.13.99.2.638
cur.execute("""create table if not exists fnsi_semd_spec (
    OID TEXT PRIMARY KEY NOT NULL,
    NAME TEXT NOT NULL,
    RELEASE TEXT NULL,
    GIT_PUB_DATE TEXT NULL,
    GIT_LINK TEXT NULL
) WITHOUT ROWID;""")

# 1.2.643.5.1.13.13.11.1520. Ведется в fnsi-downloader
cur.execute("""create table if not exists fnsi_emd (
    ID INTEGER PRIMARY KEY NOT NULL,
    TYPE INTEGER NOT NULL,
    NAME TEXT NOT NULL,
    START_DATE TEXT NOT NULL,
    END_DATE TEXT NULL,
    IMPLEMENTATION_GUIDE TEXT NULL,
    GIT_LINK TEXT NULL              -- 1.2.643.5.1.13.13.99.2.638
);""")

# 1.2.643.5.1.13.13.11.1520
cur.execute("""create table if not exists fnsi_emd_notification (
    ID INTEGER PRIMARY KEY NOT NULL,
    TYPE INTEGER NOT NULL,
    NAME TEXT NOT NULL,
    START_DATE TEXT NOT NULL,
    END_DATE TEXT NULL,
    IMPLEMENTATION_GUIDE TEXT NULL,
    GIT_LINK TEXT NULL              -- 1.2.643.5.1.13.13.99.2.638
);""")

# 1.2.643.5.1.13.13.99.2.805. Ведется в fnsi-downloader
cur.execute("""create table if not exists fnsi_semd_refs (
    ID TEXT PRIMARY KEY NOT NULL, 
    OID TEXT NOT NULL,              -- 1.2.643.5.1.13.13.99.2.638
    REF TEXT NOT NULL,              -- OID справочника ФНСИ (codeSystem)
    VERSION TEXT NULL,              -- версия справочника ФНСИ
    REF_NAME TEXT NOT NULL          -- наименование справочника (codeSystemName)
) WITHOUT ROWID;""")

# Ведется в fnsi-downloader
cur.execute("""create table if not exists fnsi_ref (
    codeSystem TEXT NOT NULL,       -- OID справочника ФНСИ
    version TEXT NULL,              -- версия справочника фнси
    codeSystemName TEXT NULL,       -- наименование справочника
    rowsCount INT NOT NULL,
    codeSystemOther TEXT,
    keyField TEXT NOT NULL,         -- наименование поля с ключом справочника
    valueField TEXT,                -- наименование поля со значением справочника
    fieldNames TEXT,                -- данные паспорта - список наименований полей. 
    actual TEXT,                    -- признак действия версии справочника, если * - то версия загружена была по запросу актуальной версии
    PRIMARY KEY(codeSystem, version)
) WITHOUT ROWID;""")

# Ведется в fnsi-downloader
cur.execute("""create table if not exists ref_setting (
    codeSystem TEXT PRIMARY KEY,                         -- OID справочника ФНСИ
    load INT NOT NULL CHECK(load IN(0,1)),               -- загружать или нет справочник
    validateRefName INT CHECK(validateRefName IN(0,1)),  -- выполнять ли по нему проверку codeSystemName в СЭМД
    keyField TEXT,                                       -- наименование поля с ключом справочника
    valueField TEXT,                                     -- наименование поля со значением справочника
    validateValue INT CHECK(load IN(0,1)),               -- выполнять ли по нему проверку displayName в СЭМД
    REKV TEXT,                                           -- JSON массив со списком полей, которые надо загрузить
    comment TEXT
) WITHOUT ROWID;""")


cur.execute("""create table if not exists fnsi_ref_ver (
    OID TEXT PRIMARY KEY NOT NULL,
    VERSION TEXT NOT NULL
) WITHOUT ROWID;""")

cur.execute("""create table if not exists semd_spec_repo (
    repo_commit TEXT NOT NULL,
    TYPE_REMD INTEGER NOT NULL,
    tag TEXT NOT NULL,
    commit_date TEXT NOT NULL,
    comment TEXT NULL,
    PRIMARY KEY(repo_commit, TYPE_REMD, tag)
) WITHOUT ROWID;""")

cur.execute("""create table if not exists repo_active_tag (
    TYPE_REMD INTEGER NOT NULL,
    active_tag TEXT NOT NULL,
    last_tag TEXT NOT NULL,
    user TEXT NULL,
    PRIMARY KEY(TYPE_REMD)
);""")

cur.execute("CREATE INDEX IF NOT EXISTS semd_spec_repo_type_remd_index ON semd_spec_repo (type_remd);")

cur.execute("insert into fnsi_ref_ver values ('1.2.643.5.1.13.13.99.2.638','')")
cur.execute("insert into fnsi_ref_ver values ('1.2.643.5.1.13.13.11.1520','')")
cur.execute("insert into fnsi_ref_ver values ('1.2.643.5.1.13.13.99.2.805','')")
cur.execute("insert into fnsi_ref_ver values ('fnsi_emd_notification','')")
cur.execute("insert into fnsi_ref_ver values ('repos','')")

cur.close()
conn.commit()

uid = pwd.getpwnam(prefs.APACHE_USER).pw_uid
gid = grp.getgrnam(prefs.APACHE_GROUP).gr_gid
os.chown(os.path.join(prefs.DATA_PATH, prefs.DB_NAME), uid, gid)
os.chown(prefs.DATA_PATH, uid, gid)
